
take(N),今天介紹也是跟數量有關的,不過它比較有個性,只抓一個 ~ first。☕
first定義如下:first(): default值是undefined,也就是說,我們不輸入任何值也可以,直接取出observable的第一個值。first(條件式):當偵測到observable的條件式吻合後,隨即結束。import { from, first, fromEvent, map } from 'rxjs';
// 建立觀察者
const observer = {
next: console.log,
complete: () => console.log('completed!'),
};
// case1: first()
console.log('=== case1: first() ===)');
from([1, 2, 3, 4, 5]).pipe(first()).subscribe(observer); //<-- 偵測到第一筆資料,隨即結束
// 印出
// 1
// completed!
HTML建置一個長寬各100px的點擊區javascript中,偵測click event,當click於x<100 或 y<100的區域,也就是我們剛剛設置的點擊區,隨即結束任務。HTML中顯示completed!
stackblitz
-html
<body>
<div style="width: 100px; height: 100px; background-color: skyBlue"></div>
<h2>fromEvent + first(condition)</h2>
<p>Click blue cubic once and then completed</p>
<p id="message" style="color: blue"></p>
</body>
javascript
// case2: fromEvent + first;
console.log('=== case2: fromEvent + first(condition) ===)');
fromEvent(document, 'click')
.pipe(
map((event: MouseEvent) => {
// retrieve clientX/Y
return { x: event.clientX, y: event.clientY };
}),
first(({ x, y }) => x < 100 && y < 100) //<-- 當點擊的x<100且y<100,代表藍色點擊區,隨即結束
)
.subscribe({
next: console.log,
complete: () => {
document.getElementById('message').innerHTML = 'completed!';
console.log('completed!');
},
});

completed的函示中,進行element的設定,顯示completed!於HTML中。case2稍微修改一下,讓整個程式更俐落。document.getElementById('click-area')取得element
element放置於fromEvent的第一個參數,即形成專屬click-area藍色區塊的observable
pipe中依序放入first(),並用map拆解出clientX/Y
// case3: fromEvent + first;
console.log('=== case3: fromEvent(element) + first(condition) ===)');
const clickArea = document.getElementById('click-area'); //<--取得element
// console.log(clickArea.id);
fromEvent(clickArea, 'click')
.pipe(
first(), //<--當clickArea被點擊一次,隨即結束
map((event: MouseEvent) => {
return { x: event.clientX, y: event.clientY };
})
)
.subscribe({
next: console.log,
complete: () => {
document.getElementById('message').innerHTML = 'completed!';
console.log('completed!');
},
});
first():預設參數為undefined,如果不提供任何參數,抓取第一筆資料後即結束。first(條件式):符合條件式,即抓取第一筆資料後結束。take與firsr適合與fromEvent搭配,可以設計出不同的使用者操作形式。第18天完工,今天說得有點多,很多都是基本功,花點時間釐清一下,鍛鍊一下RxJS的肌肉,看到沒~目標就在不遠處囉!!